#include<iostream>
#include"/Users/yjc/Programming/eurekas-algorithm-path/2.Linklist/Linklist.cpp"

class Solution {
public:
    ListNode* swapPairs(ListNode *head) {
        ListNode temp;
        temp.next=head;
        ListNode *pre=&temp,*ptr=head,*rear;
        while(ptr&&ptr->next)//注意这里第二个条件，是为了防止单数个节点
        {
            rear=ptr->next->next;
            
            pre->next=ptr->next;
            ptr->next->next=ptr;
            pre=ptr;
            ptr=rear;
        }
        pre->next=rear;
        head=temp.next;
        return head;
    }

    ListNode* swapPairs2(ListNode *head)
    //将其两两分为一组
    //在递归里的head即为每组的头
    //用head和newhead两个参数定位每组的两个节点
    {  
        if (head == nullptr || head->next == nullptr) {
            return head;
        }
        ListNode* newHead = head->next;//将原链表每组的第二个作为每组的新头
        head->next = swapPairs(newHead->next);//在下一条语句改之前先传进下一层去
        //这个节点的指针域指向下一组
        //下一组的头是该函数的返回值
        newHead->next = head;//将本组第二个指向第一个，也就是交换
        return newHead;
    }
};
int main()
{
    LinkList l;
    l.insert(1,0);
    l.insert(2,0);
    l.insert(3,0);
    //l.insert(4,0);
    Solution s;
    l.head=s.swapPairs(l.head);
    l.print();
}